package com.zhiyuancode.main;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/**
 * @author 杨志远[OF2551]
 * email faryangsh@163.com
 * Date    2018-11-24
 */
public class BeanUtils {

    /**
     * 获取set方法
     *
     * @param beanObj   对象
     * @param fieldName 属性/字段 名称
     * @return
     */
    public static Method getWriteMethod(Object beanObj, String fieldName) {
        // 使用内省技术实现该方法

        Method method = null;
        // 分析bean对象 => Beaninfo
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(beanObj.getClass());

            // 根据BeanInfo获得所有属性的描述器
            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
            // 遍历这些属性描述器
            if (pds != null) {
                for (PropertyDescriptor pd : pds) {
                    // 判断当前遍历的描述器 是否是当前要找的属性
                    // 获得当前描述器描述的属性名称
                    String pName = pd.getName();
                    // 使用要找的属性名称与当前描述器描述的属性名称比对
                    if (pName.equals(fieldName)) {
                        // 比对一致 =>找到了
                        method = pd.getWriteMethod();
                    }
                }
            }

        } catch (IntrospectionException e) {
            e.printStackTrace();
        }

        // 如果没有找到 =>抛出异常，提示用户检查创建属性的set方法
        if (method == null) {
            throw new RuntimeException("检查属性的set方法是否创建,属性=" + fieldName);
        }
        // 返回找到的set方法
        return method;
    }
}
